//***************************************************************************//
//*
//* 内容摘要：QOS-FEC-NACK库使用的一些公共定义
//*	
//* 当前版本：V1.0		
//* 作    者：zhfayuan
//* 完成日期：2016-8-21
//**************************************************************************//
#ifndef COMM_H
#define COMM_H

#include <stdio.h>

#ifdef __cplusplus
extern "C" {
#endif

#if defined(__WIN32__) || defined(_WIN32) || defined(_WIN32_WCE)
#include <windows.h>
#include <string.h>
#include <time.h>

#if defined(_WIN32_WCE)
#define NO_STRSTREAM 1
#endif

#elif defined(VXWORKS)

#include <time.h>
#include <timers.h>
#include <sys/times.h>
#include <sockLib.h>
#include <hostLib.h>
#include <resolvLib.h>
#include <ioLib.h>

#else

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <strings.h>
#include <ctype.h>
#include <stdarg.h>
#include <math.h>
#include <pwd.h>
#define closesocket close
#if defined(_QNX4)
#include <sys/select.h>
#include <unix.h>
#endif

#endif

#ifndef VOID
       #define VOID void
#endif

#ifndef ERROR
	#define ERROR -1
#endif	
#ifndef OK
	#define OK 0
#endif	
#ifndef TRUE
	#define TRUE 1
#endif
#ifndef FALSE
	#define FALSE 0
#endif

#ifndef INVALID_SOCKET
	#define INVALID_SOCKET (-1)
#endif
#ifndef SOCKET_ERROR
#define SOCKET_ERROR (-1)
#endif

#ifdef __APPLE__
#ifndef OBJC_BOOL_DEFINED
	#define BOOL int
#endif 
#else
#ifndef BOOL
	#define BOOL int
#endif
#endif

#ifndef VXWORKS

#ifndef INT8
#define INT8 char
#endif

#ifndef UINT8
#define UINT8 unsigned char
#endif

#ifndef INT16
#define INT16 short
#endif

#ifndef UINT16
#define UINT16 unsigned short
#endif

#ifndef INT32
#define INT32 int
#endif

#ifndef UINT32
#define UINT32 unsigned int
#endif

#ifndef CHAR
#define CHAR char
#endif

#ifndef UCHAR
//#define UCHAR unsigned char
#endif

#endif

typedef INT32		MD_STATUS;
#define MD_OK		0
#define MD_ERR		(-1)

#ifndef MIN
#define MIN(a, b)   (((a) < (b)) ? (a) : (b))
#endif

#ifndef MAX
#define MAX(a, b)	(((a) > (b)) ? (a) : (b))
#endif

#ifndef	IP_TO_STR
#define	IP_TO_STR(ip)	inet_ntoa(*(struct in_addr *)&(ip))
#endif

#ifdef WIN32
typedef signed __int64       int64_t;
typedef unsigned __int64     uint64_t;
#endif

#define    MAX_HEADER_LEN	 	48


#ifndef MILLION
#define   MILLION 1000000
#endif

#define   TIME_ZERO(a)  		{(a).tv_sec  = 0;(a).tv_usec = 0;}
#define   TIME_MAKE(a, b)		{(a).tv_sec  = (b).tv_sec;(a).tv_usec = (b).tv_usec;}
#define   TIME_MINUS(a, b)	{(a).tv_sec  -= (b).tv_sec;(a).tv_usec -= (b).tv_usec;	if((a).tv_usec < 0){(a).tv_usec += MILLION;--(a).tv_sec;}if((a).tv_sec < 0){	(a).tv_sec = 0;(a).tv_usec= 0;}}
#define   TIME_ADD(a, b)		{(a).tv_sec  += (b).tv_sec;(a).tv_usec += (b).tv_usec; if((a).tv_usec >= MILLION){(a).tv_usec -= MILLION;(a).tv_sec++;}}
#define   TIME_ADD_US(a, b)	{(a).tv_sec  += (b)/MILLION;(a).tv_usec += (b)%MILLION;if((a).tv_usec >= MILLION){	(a).tv_usec -= MILLION;	(a).tv_sec++;}}
#define   TIME_ISLARGER(a, b)  ((( (a).tv_sec == (b).tv_sec ) && ((a).tv_usec >= (b).tv_usec )) || ((a).tv_sec > (b).tv_sec))


#define   MAX_UINT32						0xFFFFFFFF
#define   MAX_UINT64						0xFFFFFFFFFFFFFFFF

#define	  ENABLE_NACK						1
#define   ENABLE_SEND_SMOOTH_INTERNAL		1
#define   ENABLE_DYNAMIC_GROUP_SIZE			1
#ifdef __cplusplus
}
#endif
	
#endif
